2023-11-12
회전하는 큐
https://www.acmicpc.net/problem/1021
원하는 값을 꺼내기 위해 큐를 오른쪽, 왼쪽으로 회전시키는 문제
덱(deque)을 이용해 풀 수 있음
내가 쓴 답변
# 1. 큐의 가운데 위치한 값을 찾는다 # 2. data의 타겟 인덱스가 큐의 중앙 인덱스 보다 작으면 왼쪽으로 돌린다. # 3. 그게 아니면 오른쪽으로 돌린다. from collections import deque n, m = map(int, input().split()) data = list(map(int, input().split())) queue = deque([i for i in range(1, n + 1)]) count = 0 for currnet_value in data: target_index = queue.index(currnet_value) center_index = len( queue) // 2 if len(queue) % 2 == 1 else len(queue) // 2 - 1 while currnet_value != queue[0]: if target_index <= center_index: queue.append(queue.popleft()) count += 1 else: queue.appendleft(queue.pop()) count += 1 queue.popleft() print(count)
다른 답변
from collections import deque n, m = map(int, input().split()) # 원소의 개수, 뽑아내는 횟수 d = deque([i for i in range(1, n + 1)]) # 1부터 N까지의 원소를 삽입 targets = list(map(int, input().split())) # 뽑아낼 원소 목록 cnt = 0 # 회전 연산 수행 횟수 for target in targets: # 뽑아낼 원소를 하나씩 확인하며 index = d.index(target) # 덱에서 해당 원소의 위치를 찾기 if index <= len(d) // 2: # 왼쪽으로 돌리는 게 더 빠른 경우 for i in range(index): # 회전 연산 반복 수행 x = d.popleft() d.append(x) cnt += 1 else: # 오른쪽으로 돌리는 게 더 빠른 경우 for i in range(len(d) - index): # 회전 연산 반복 수행 x = d.pop() d.appendleft(x) cnt += 1 d.popleft() # 원소 꺼내기 print(cnt) # 결과 출력
